#e
#Title[rsfuAˉv]
#Text[]
#Image[]
#BackGround[]
#BGM[]
#PlayLevel[Extra]
#ScriptVersion[2]
#Player[FREE]

script_enemy_main
{
let usebomb=0;
let phase=0;
let pastx=GetCenterX;

	//GoɈxs镔
	@Initialize
	{
	//   eϐ

	//   XyJ[hf[^
	SetLife(1200);
	SetScore(300000);
	SetDamageRate(20,  0);
	SetTimer(180);
	SetInvincibility(250);
	LoadGraphic("script\img\ExRumia.png");
	CutIn(KOUMA,"rsfuAˉv",GetCurrentScriptDirectory~"..\img\cutin10.png",0,0,255,320);
	}
	//   ʒuɒڔzu
	SetX(GetCenterX);
	SetY(GetCenterY-100);

	BG_Standard;
	AtackTask;
	MoveTask;
	ControlTask;

	//G̃Ct0ɂȂ܂ŁA̕1t[1s
	@MainLoop
	{
		yield;

		if(OnBomb==false){
			SetCollisionA(GetX, GetY, 32);
			SetCollisionB(GetX, GetY, 24);
			usebomb=0;
		}
		else{
			usebomb++;
		}
		if(usebomb==1){
			BombBarrier;
		}
		pastx=GetX;
	}
	
	//`惋[vB1t[1s
	@DrawLoop
	{
		SetGraphicRect(64,1,127,64);
		if(phase<4){
			SetGraphicRect(0,1,63,64);
			if(GetX-pastx<-1){
				SetGraphicRect(128,1,191,64);
			}
			if(GetX-pastx>1){
				SetGraphicRect(192,1,255,64);
			}
		}
		SetColor(255,255,255);
		SetAlpha(255);
		if(OnBomb==true){SetAlpha(96);}
		SetTexture("script\img\ExRumia.png");//摜͔q
		DrawGraphic(GetX(),GetY());//G̍WEx[~A`;
	}

	//GłuԂɈxs镔
	@Finalize
	{
		DeleteGraphic("script\img\ExRumia.png");
		DeleteGraphic(GetCurrentScriptDirectory ~"..img\back1.png");
		DeleteGraphic(GetCurrentScriptDirectory ~"..img\back2.png");
	}
	//XyJ[h̔wi
	//Ă悢
	@BackGround
	{
		BG_Simple;
	}

	task AtackTask{
		wait(120);

		while(phase==0){	//^˃[U[
			let dir=45;
			loop(3){
				ReflectLaser(GetX,GetY,3,dir,10,60,0,65535,BLUE01,0);
				dir+=45;
			}
			loop(100){
				if(phase>0){break;}
				yield;
			}
		}
		wait(60);
		GradiusOption(GetX,GetY,100,0,ORANGE03,false);
		ascent(i in 1..4){
			GradiusOption(i*60+GetX,GetY,100,0,ORANGE03,true);
		}
		while(phase==1){	//^[U[{IvV
			wait(1);
		}
		while(phase==2){	//HHH
			CreateShot01(GetX,GetY,3,90,WHITE01,0);
			wait(15);
		}
		wait(60);
		let count=0;
		while(phase==3){	//\W[
				CreateShot01(GetX,GetY,6,90,WHITE01,0);
				let dir=45;
				loop(4){
					CreateShot01(GetX,GetY,8,dir,WHITE01,0);
					dir+=90;
				}
			wait(3);
			count++;
			if(count==4){
				wait(3);
				count=0;
			}
		}

	}

	task GradiusOption(	//IvVBƍWQƗpB
		x,
		y,
		interval,	//VbgԊu
		delay,		//{̂̓ǂꂾx邩
		grf,
		visible		//\邩ۂ(boolean^)
	){
		let obj=Obj_Create(OBJ_SHOT);
		Obj_SetAngle(obj,180);
		Obj_SetPosition(obj,x,y);
		if(visible==false){Obj_SetAlpha(obj,0);}
		ObjShot_SetGraphic(obj,grf);
		ObjShot_SetBombResist(obj,true);
		let count=-delay;
		let shotcnt=0;
		while(!Obj_BeDeleted(obj)){
			if(BorderRight(Obj_GetX(obj),0)==true){
				Obj_SetAngle(obj,180);
				Obj_SetX(obj,GetClipMaxX);
				Obj_SetSpeed(obj,3);
			}
			if(BorderLeft(Obj_GetX(obj),0)==true){
				Obj_SetAngle(obj,0);
				Obj_SetX(obj,GetClipMinX);
				Obj_SetSpeed(obj,3);
			}
			count++;
			if(count==120){
				Obj_SetSpeed(obj,0);
				count=-60;
			}
			if(count==0){
				Obj_SetSpeed(obj,3);
			}
			shotcnt++;
			if(shotcnt==interval){
				GradiusLaser(obj,BLUE01);
				shotcnt=0;
			}
			if(phase>1){
				Obj_Delete(obj);
			}
			yield;
		}
	}
	task GradiusLaser(
		id,	//eIvVID
		grf
	){
		let obj=Obj_Create(OBJ_LASER);
		Obj_SetAngle(obj,90);
		ObjShot_SetGraphic(obj,grf);
		ObjLaser_SetSource(obj,false);
		ObjLaser_SetWidth(obj,10);
		let long=0;
		while(!Obj_BeDeleted(obj)){
			long+=6;
			if(long<360){
				ObjLaser_SetLength(obj,long);
				Obj_SetY(obj,Obj_GetY(id));
			}
			else{
				Obj_SetY(obj,Obj_GetY(id)+long-360);
			}
			Obj_SetX(obj,Obj_GetX(id));
			if(Obj_BeDeleted(id)==true){
				Obj_Delete(obj);
			}
			yield;
		}
	}

	task ReflectLaser(	//ʒ[AȊOŔ˂郌[U[
		x,
		y,
		spd,
		dir,
		size,
		long,
		plus,	//ʒ[Wɕ␳
		ammo,	//ő唽ˉ
		grf,
		delay
	){
		let obj=Obj_Create(OBJ_SINUATE_LASER);
		Obj_SetPosition(obj,x,y);
		Obj_SetSpeed(obj,spd);
		Obj_SetAngle(obj,dir);
		ObjShot_SetGraphic(obj,grf);
		ObjShot_SetDelay(obj,delay);
		ObjSinuateLaser_SetLength(obj,long);
		ObjSinuateLaser_SetWidth(obj,size);
		while(!Obj_BeDeleted(obj)){
			if(ammo>0){
				if(BorderLeft(Obj_GetX(obj),plus)==true){
					Obj_SetX(obj,GetClipMinX+(GetClipMinX-plus-Obj_GetX(obj)));
					Obj_SetAngle(obj,180-Obj_GetAngle(obj));
					ammo--;
				}
				if(BorderRight(Obj_GetX(obj),plus)==true){
					Obj_SetX(obj,GetClipMaxX+(GetClipMaxX+plus-Obj_GetX(obj)));
					Obj_SetAngle(obj,180-Obj_GetAngle(obj));
					ammo--;
				}
				if(BorderBottom(Obj_GetY(obj),plus)==true){
					Obj_SetY(obj,GetClipMaxY+(GetClipMaxY+plus-Obj_GetY(obj)));
					Obj_SetAngle(obj,0-Obj_GetAngle(obj));
					ammo--;
				}
			}
			yield;
		}
	}

	task MoveTask{
		wait(120);
		let dir=[0,45,90,135,180,225,270,315,0,45,90];
		let count=0;
		let change=rand_int(60,120);
		SetSpeed(2*rand_int(0,1));
		SetAngle(dir[rand_int(0,7)]);
		while(phase==0){
			if(BorderLeft(GetX,-80)==true){
				SetAngle(dir[rand_int(7,9)]);
				SetX(GetClipMinX+80);
				SetSpeed(2);
			}
			else if(BorderRight(GetX,-80)==true){
				SetAngle(dir[rand_int(3,5)]);
				SetX(GetClipMaxX-80);
				SetSpeed(2);
			}
			else if(BorderTop(GetY,-80)==true){
				SetAngle(dir[rand_int(1,3)]);
				SetY(GetClipMinY+80);
				SetSpeed(2);
			}
			else if(BorderBottom(GetY,-200)==true){
				SetAngle(dir[rand_int(5,7)]);
				SetY(GetClipMaxY-200);
				SetSpeed(2);
			}
			else if(count==change){
				SetAngle(dir[rand_int(0,7)]);
				if(GetSpeed==0){SetSpeed(2);}
				else{SetSpeed(2*rand_int(0,1));}
				count=0;
			}
			count++;
			yield;
		}
		SetMovePosition02(GetCenterX,GetClipMinY+30,60);
		wait(60);
		SetSpeed(3);
		SetAngle(dir[4]);
		count=0;
		while(phase==1){
			if(BorderRight(GetX,0)==true){
				SetAngle(dir[4]);
				SetX(GetClipMaxX);
				SetSpeed(3);
			}
			if(BorderLeft(GetX,0)==true){
				SetAngle(dir[0]);
				SetX(GetClipMinX);
				SetSpeed(3);
			}
			count++;
			if(count==120){
				SetSpeed(0);
				count=-60;
			}
			if(count==0){
				SetSpeed(3);
			}
			yield;
		}
		SetSpeed(0);
		let mx=(GetX-GetPlayerX)/60;
		let my=(GetY-GetPlayerY)/60;
		descent(i in 0..60){
			SetX(i*mx+GetPlayerX);
			SetY(i*my+GetPlayerY-40);
			yield;
		}
		while(phase==2){
			SetX(GetPlayerX);
			SetY(GetPlayerY-40);
			yield;
		}
		SetMovePosition02(GetCenterX,GetClipMinY+100,60);
		wait(60);
		count=0;
		SetSpeed(4);
		SetAngle(dir[rand_int(0,7)]);
		while(phase==3){
			if(BorderLeft(GetX,0)==true){
				SetAngle(dir[rand_int(7,9)]);
				SetX(GetClipMinX);
				SetSpeed(4);
			}
			else if(BorderRight(GetX,0)==true){
				SetAngle(dir[rand_int(3,5)]);
				SetX(GetClipMaxX);
				SetSpeed(4);
			}
			else if(BorderTop(GetY,0)==true){
				SetAngle(dir[rand_int(1,3)]);
				SetY(GetClipMinY);
				SetSpeed(4);
			}
			else if(BorderBottom(GetY,-200)==true){
				SetAngle(dir[rand_int(5,7)]);
				SetY(GetClipMaxY-200);
				SetSpeed(4);
			}
			else if(count==change){
				SetAngle(dir[rand_int(0,7)]);
				if(GetSpeed==0){SetSpeed(4);}
				else{SetSpeed(4);}
				count=0;
			}
			count++;
			yield;
		}

	}

	task ControlTask{
		let gate=300;
		wait(250);
		while(GetEnemyLife>gate*3){yield;}
		phase++;
		SetInvincibility(180);
		while(GetEnemyLife>gate*2){yield;}
		phase++;
		SetInvincibility(180);
		while(GetEnemyLife>gate){yield;}
		phase++;
		SetInvincibility(180);
	}

	#include_function".\function.txt"
}

